/*
 *	File: ipcstruct.c			08-lug-05 h19.00
 *
 *	definisce le funzioni per semplificare le strutture IPC.
 * */
#include "ipcstruct.h"

/*
 *	preleva un set di semafori
 * */
void initsem(int *semid, int key, int nsems){
	errno=0;
	*semid=semget(key,nsems,IPC_CREAT|IPC_EXCL|ALL_RW);
	
	if(*semid<0){
		if(errno==EEXIST) *semid=semget(key,0,0);
		else{perror("Impossibile prelevare set di semafori");exit(1);}
	}
}

/*	
 *	gestisce un set di semafori	
 *		semid: id semaforo
 *		nsems: lunghezza dell'array di semafori
 *		nsem: posizione del semaforo che si desira modificare
 *		op: specifica il tipo di operazione che si vuole fare
 *			decremento op=-1, incremento op=1
 * */
int semaforo(int semid, int nsems, int nsem, int op){
	struct sembuf set_sem[nsems];
	
	set_sem[nsem].sem_num=nsem;
	set_sem[nsem].sem_op=op;
	set_sem[nsem].sem_flg=0;
	
	return semop(semid,set_sem,nsems);
}
